package com.hsnn.medstgmini.sys.controller;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hsnn.medstgmini.Constants;
import com.hsnn.medstgmini.model.Whether;
import com.hsnn.medstgmini.sys.model.RoleType;
import com.hsnn.medstgmini.sys.model.SysPrivilege;
import com.hsnn.medstgmini.sys.model.SysRole;
import com.hsnn.medstgmini.sys.model.SysRoleType;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.sys.service.SysRoleManager;
import com.hsnn.medstgmini.sys.service.SysUserManager;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.SelectForm;

/**
 * @category 角色管理
 * @author 蔡春龙
 * @date 2015年6月14日
 */
@Controller
@RequestMapping("/sysRole")
public class SysRoleController {

	private static final Logger log = Logger.getLogger(SysRoleController.class);

	@Autowired
	private SysRoleManager roleManager;
	
	@Autowired
	private SysUserManager sysUserManager;
	
	@Autowired
	private HttpServletRequest request;

	@Autowired
	private HttpSession session;

	/**
	 * @category 获取当前登陆人信息
	 * @date 2015年6月14日
	 * @return
	 */
	private SysUser getUser() {
		return (SysUser) session.getAttribute(Constants.USERINFO);
	}

	/**
	 * @category 中心跳转主角色角色管理列表
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/zxRoleList")
	public String zxRoleList() {
		log.info("enter zxRoleList method");
		return "/sys/zxRoleList";
	}

	/**
	 * @category 中心跳转子角色管理列表
	 * @author 韩守松
	 * @date   2015年10月16日
	 * @param  @return
	 */
	@RequestMapping(value={"/zxMinRoleList","/subMinRoleList"})
	public String zxMinRoleList() {
		log.info("enter zxRoleList method");
		return "/sys/juese/zxMinRoleList";
	}
/*	*//**
	 * @category 中心跳转子角色管理列表
	 * @date 2015年6月14日
	 * @return
	 *//*
	@RequestMapping("/zxSubRoleList")
	public String zxSubRoleList(Model model, String id) {
		log.info("enter zxSubRoleList method");
		SysRole role = new SysRole();
		if (StringUtils.isNotBlank(id)) {
			role = roleManager.getRoleById(id);
		}
		// 父角色
		model.addAttribute("role", role);
		return "/sys/zxSubRoleList";
	}*/

	/**
	 * @category 中心主角色列表
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/getZxRoleList")
	@ResponseBody
	public Pagination getZxRoleList(SysRole role) {
		log.info("enter getZxRoleList method");
		Pagination page = new Pagination(request);
		try {
			List<SysRole> list = roleManager.getZxRoleList(page, role);
			page.setRows(list);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	
	
	/**
	 * @category 中心 子角色管理列表
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/getZxSubRoleList")
	@ResponseBody
	public Pagination getZxSubRoleList(SysRole role) {
		log.info("enter getZxSubRoleList method");
		Pagination page = new Pagination(request);
		String pid = request.getParameter("parentid");
		String id = request.getParameter("nodeid");
		String level = request.getParameter("n_level");
		String name = request.getParameter("name");
		SysUser su= getUser();
		pid =  SysRoleType.getSysRoleType(su.getType()).getValue();
		String boundId = su.getOrgId();
		page.getConditions().put("boundId", boundId);
		boolean isLoaded = true;//是否加载子节点
		if(StringUtils.isNotBlank(id)){
			pid = id;
		}
		if(StringUtils.isNotBlank(pid)){
			page.getConditions().put("pid", pid);
		}
		if(StringUtils.isNotBlank(level)){
			page.getConditions().put("level", level);
		}
		if(StringUtils.isNotBlank(name)){
			page.getConditions().put("name", name);
			isLoaded = false; //当模糊查询时，子节点自动加载
		}
		if(null != role.getStatus()){
			page.getConditions().put("status", role.getStatus().toString());
		}
		try {
			page=roleManager.getSubRoleList(page, isLoaded);
		} catch (Exception e) {
			log.error("",e);
		}
		return page;
	}
	
	
	/**
	 * @category 获取父级角色id且是非系统级别的
	 * @author 韩守松
	 * @date   2015年10月19日
	 * @param  @return
	 */
	@RequestMapping("/getFatherList")
	@ResponseBody
	public List<SelectForm> getFatherList() {
		String rootId = "";
		String roleId = "";
		if(getUser().getMain() == 1){
			  rootId= getUser().getId();
			  roleId =  roleManager.getUserRoleById(rootId);
		}else{
			 rootId= getUser().getRootUser().getId();
			 roleId =  roleManager.getUserRoleById(rootId);
		}
		String boundId = getUser().getOrgId();
		List<Object[]> list = new ArrayList<Object[]>();
		List<SelectForm> selectFormlist = new ArrayList<SelectForm>();
		list = roleManager.getFatherIdList(roleId,boundId);
		if (list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				SelectForm form = new SelectForm();
				Object[] strs= list.get(i);
					form.setValue(strs[0].toString());
					form.setText(strs[1].toString());
				selectFormlist.add(form);
			}
		}
		return selectFormlist;
	}

	/**
	 * @category 启用|停用
	 * @param role
	 * @return
	 */
	@RequestMapping("changeStatus")
	@ResponseBody
	public Pagination changeStatus(SysRole role) {
		Pagination page = new Pagination();
		try {
			if (role != null && role.getId() != null) {
				role.setUpdUser(getUser().getId());
				roleManager.changeStatus(role);
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 批量(启用|停用)
	 * @param array
	 * @return
	 */
	@RequestMapping("batchChangeStatus")
	@ResponseBody
	public Pagination batchChangeStatus(String array) {
		Pagination page = new Pagination();
		try {
			if (array != null && !"".equals(array)) {
				Gson gson = new Gson();
				Type type = new TypeToken<List<SysRole>>() {
				}.getType();
				List<SysRole> list = gson.fromJson(array, type);
				if (list != null && !list.isEmpty()) {
					for (SysRole sr : list) {
						sr.setUpdUser(getUser().getId());
					}
					roleManager.batchChangeStatus(list);
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心跳转角色新增编辑页面
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/zxRoleEdit")
	public String zxRoleEdit(Model model, int opType, String id) {
		log.info("enter zxRoleEdit method");
		SysRole role = new SysRole();
		if (opType == 1 && id != null) {
			role = roleManager.getRoleById(id);
			if (role == null) {
				role = new SysRole();
			}
		}
		model.addAttribute("opType", opType);
		model.addAttribute("role", role);
		return "/sys/zxRoleEdit";
	}

	/**
	 * @category 根据子角色的id修改角色信息
	 * @author 韩守松
	 * @date   2015年10月20日
	 * @param  @param model
	 * @param  @param opType
	 * @param  @param id
	 * @param  @param pid
	 * @param  @return
	 */
	@RequestMapping("/zxSubRoleEdit")
	@ResponseBody
	public SysRole zxSubRoleEdit(Model model, int opType, String id) {
		log.info("enter zxRoleEdit method");
		SysRole role = new SysRole();
		if (opType == 1 && id != null) {
			role = roleManager.getRoleById(id);
			if (role == null) {
				role = new SysRole();
			}
		}
		
		return role;
	}

	/**
	 * @category 中心保存 角色信息（子角色信息保存）
	 * @author 韩守松
	 * @date   2015年10月16日
	 * @param  @param role
	 * @param  @param privileges
	 * @param  @return
	 */
	@RequestMapping("zxSaveRole")
	@ResponseBody
	public Pagination zxSaveRole(SysRole role) {
		Pagination page = new Pagination();
		try {
			String rootId = "";
			String roleId = "";
			if(getUser().getMain() == 1){
				  rootId= getUser().getId();
				  roleId =  roleManager.getUserRoleById(rootId);
			}else{
				 rootId= getUser().getRootUser().getId();
				 roleId =  roleManager.getUserRoleById(rootId);
			}
			if (role != null) {
				role.setMain(0);
				int levelTag=Constants.LEVEL_GRADE_TWE;
				if(StringUtils.isBlank(role.getPid())||"0".equals(role.getPid())){
					role.setPid(roleId);
				}else{
					levelTag=Constants.LEVEL_GRADE_THREE;
				}
				
				role.setLevel(levelTag);	
				role.setType(RoleType.custom.getKey());
				role.setBoundId(getUser().getOrgId());
				role.setStatus(Whether.yes.getKey());
				role.setCreateDateTime(new Date());
				role.setCreateUserId(getUser().getId());
				//role.setUpdDateTime(new Date());
				//role.setUpdUser(getUser().getId());
				roleManager.zxSaveRole(role);
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 医疗机构、生产企业、配送企业 跳转角色列表页面
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/subRoleList")
	public String subRoleList() {
		log.info("enter subRoleList method");
		return "/sys/subRoleList";
	}

	/**
	 * @category 医疗机构、生产企业、配送企业管理员查询公共子角色和自定义子角色管理列表
	 * @date 2015年6月14日
	 * @return
	 *//*
	@RequestMapping("/getSubRoleList")
	@ResponseBody
	public JSONObject getSubRoleList(SysRole editRole) {
		log.info("enter getSubRoleList method");
		Pagination page = new Pagination(request);
		JSONObject objson= null;
		String pid = request.getParameter("parentid");
		String id = request.getParameter("nodeid");
		String level = request.getParameter("n_level");
		String name = request.getParameter("name");
		boolean isLoaded = true;//是否加载子节点
		if(StringUtils.isNotBlank(pid)){
			page.getConditions().put("pid", pid);
		}
		if(StringUtils.isNotBlank(id)){
			page.getConditions().put("id", id);
		}
		if(StringUtils.isNotBlank(level)){
			page.getConditions().put("level", level);
		}
		if(StringUtils.isNotBlank(name)){
			page.getConditions().put("name", name);
			isLoaded = false; //当模糊查询时，子节点自动加载
		}
		try {
			objson = roleManager.getSubRoleList(page, isLoaded);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e);
		}
		return objson;*/
	/*	Pagination page = new Pagination(request);
		try {
			SysRole role = getUser().getRole();
			List<SysRole> list = roleManager.getSubRoleList(page, role,
					editRole, getUser().getId());
			page.setRows(list);
			page.setSuccess(true);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e);
			page.setSuccess(false);
		}
		return page;*/
	//}

	/**
	 * @category 医疗机构、生产企业、配送企业管理员跳转角色新增编辑页面
	 * @date 2015年6月14日
	 * @return
	 */
	@RequestMapping("/subRoleEdit")
	public String subRoleEdit(Model model, int opType, String id) {
		log.info("enter subRoleEdit method");
		SysRole role = new SysRole();
		if (opType == 1 && id != null) {
			role = roleManager.getRoleById(id);
			if (role == null) {
				role = new SysRole();
			}
		}
		SysRole fatherRole = getUser().getRole();
		model.addAttribute("opType", opType);
		model.addAttribute("role", role);
		model.addAttribute("fatherRole", fatherRole);
		return "/sys/subRoleEdit";
	}

	/**
	 * @category 医疗机构、生产企业、配送企业管理员保存角色信息
	 * @param role
	 * @return
	 */
	@RequestMapping("subSaveRole")
	@ResponseBody
	public Pagination subSaveRole(SysRole role, String privileges) {
		Pagination page = new Pagination();
		try {
			if (role != null) {
				role.setType(RoleType.custom.getKey());
				role.setBoundId(getUser().getId());
				if (StringUtils.isNotBlank(role.getId())) {
					role.setUpdUser(getUser().getId());
				} else {
					role.setCreateUserId(getUser().getId());
				}
				List<SysPrivilege> list = null;
				if (StringUtils.isNotBlank(privileges)) {
					Gson gson = new Gson();
					Type type = new TypeToken<List<SysPrivilege>>() {
					}.getType();
					list = gson.fromJson(privileges, type);
				}
				roleManager.zxSaveRole(role, list);
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 启用|停用
	 * @param role
	 * @return
	 */
	@RequestMapping("subChangeStatus")
	@ResponseBody
	public Pagination subChangeStatus(SysRole role) {
		Pagination page = new Pagination();
		try {
			if (role != null && role.getId() != null) {
				role.setUpdUser(getUser().getId());
				roleManager.subChangeStatus(role);
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 子角色状态停用|启用
	 * @author 韩守松
	 * @date   2015年10月21日
	 * @param  @param array
	 * @param  @return
	 */
	@RequestMapping(value={"enable","disable"})
	@ResponseBody
	public Pagination subBatchChangeStatus(String array) {
		Pagination page = new Pagination();
		try {
			if (array != null && !"".equals(array)) {
				Gson gson = new Gson();
				Type type = new TypeToken<List<SysRole>>() {
				}.getType();
				List<SysRole> list = gson.fromJson(array, type);
				if (list != null && !list.isEmpty()) {
					for (SysRole sr : list) {
						sr.setUpdUser(getUser().getId());
					}
					roleManager.subBatchChangeStatus(list);
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}
	
	@RequestMapping("/addRole")
	@ResponseBody
	public Pagination addRole(SysRole role){
		Pagination page = new Pagination();
		try {
			roleManager.addRole(role);
			page.setSuccess(true);
		} catch (Exception e) {
			page.setSuccess(false);
		}
		return page;
	}
	
	@RequestMapping("/eidtRole")
	@ResponseBody
	public Pagination eidtRole(SysRole role){
		Pagination page = new Pagination();
		try {
			roleManager.eidtRole(role);
			page.setSuccess(true);
		} catch (Exception e) {
			page.setSuccess(false);
		}
		return page;
	}
	
	@RequestMapping("/deleteRole")
	@ResponseBody
	public Pagination deleteRole(){
		Pagination page = new Pagination();
		try {
			roleManager.deleteRole(request.getParameter("id"));
			page.setSuccess(true);
		} catch (Exception e) {
			page.setSuccess(false);
		}
		return page;
	}
	
	@RequestMapping("/getUserRoleList")
	@ResponseBody
	public Pagination getUserRoleList(){
		Pagination page = new Pagination();
		String userId = request.getParameter("userId");
		page.setRows(roleManager.getUserRoleList(userId));
		return page;
	}

}
